package pos.domain;

import java.io.Serializable;

public class Corso implements Serializable{

    private String nome;
    private int anno;
    private int semestre;
    private int crediti;
    private String docente;
    private TipoLinkDeveSostenere utente;
//    private HashSet<TipoLinkCorrelata> insieme_attivita;
//    private HashSet<TipoLinkMC> insieme_mat_did;
    public static final int MIN_LINK_DEVE_SOSTENERE = 1;

    public Corso() {
    }

    
    public Corso(String nome, int anno, int semestre, int crediti, String docente) {
        
        this.nome = nome;
        this.anno = anno;
        this.semestre = semestre;
        this.crediti = crediti;
        this.docente = docente;
 //       insieme_attivita = new HashSet<TipoLinkCorrelata>();
//		 insieme_mat_did=new HashSet<TipoLinkMC>();
    }

    //gestione delle associazioni
    //--"Deve_sostenere"
    public int quantiUtenti() {
        if (utente == null) {
            return 0;
        } else {
            return 1;
        }
    }

    public void inserisciLinkDeveSostenere(TipoLinkDeveSostenere t) {
        if (t != null && t.getCorso() == this) {
            ManagerDeveSostenere.inserisci(t);
        }
    }

    public void eliminaLinkDeveSostenere(TipoLinkDeveSostenere t) {
        if (t != null && t.getCorso() == this) {
            ManagerDeveSostenere.elimina(t);
        }
    }

    public TipoLinkDeveSostenere getLinkDeveSostenere() throws EccezioneCardMinMax {
        if (utente == null) {
            throw new EccezioneCardMinMax("Cardinalita� minima violata");
        } else {
            return utente;
        }
    }

    public void inserisciPerManagerDeveSostenere(ManagerDeveSostenere a) {
        if (a != null) {
            utente = a.getLink();
        }
    }

    public void eliminaPerManagerDeveSostenere(ManagerDeveSostenere a) {
        if (a != null) {
            utente = null;
        }
    }
/*
    //---"Correlata"
    public Set<TipoLinkCorrelata> getAttivita() {
        return (HashSet<TipoLinkCorrelata>) insieme_attivita.clone();
    }
    
     * public void inserisciLinkCorrelata(TipoLinkCorrelata link){
     * if(link!=null&&link.getCorso()==this){ ManagerCorrelata.inserisci(link);
     * } }
     *
     * public void eliminaLinkCorrelata(TipoLinkCorrelata link){
     * if(link!=null&&link.getCorso()==this){ ManagerCorrelata.elimina(link); }
     * }
     *
     * public void inserisciPerManagerCorrelata(ManagerCorrelata m){
     * if(m!=null)insieme_attivita.add(m.getLink()); }
     *
     * public void eliminaPerManagerCorrelata(ManagerCorrelata m){
     * if(m!=null)insieme_attivita.remove(m.getLink()); }
     *
     * //---"M-C"
     *
     * public Set<TipoLinkMC> getMatDid(){ return
     * (HashSet<TipoLinkMC>)insieme_mat_did.clone(); }
     

    public void inserisciLinkMC(TipoLinkMC link) {
        if (link != null && link.getCorso() == this) {
            ManagerMC.inserisci(link);
        }
    }

    public void eliminaLinkMC(TipoLinkMC link) {
        if (link != null && link.getCorso() == this) {
            ManagerMC.elimina(link);
        }
    }
    /*
     * public void inserisciPerManagerMC(ManagerMC m){
     * if(m!=null)insieme_mat_did.add(m.getLink()); }
     *
     * public void eliminaPerManagerMC(ManagerMC m){
     * if(m!=null)insieme_mat_did.remove(m.getLink()); }
     */
    // funzioni Set&Get

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getAnno() {
        return anno;
    }

    public void setAnno(int anno) {
        this.anno = anno;
    }

    public int getSemestre() {
        return semestre;
    }

    public void setSemestre(int semestre) {
        this.semestre = semestre;
    }

    public int getCrediti() {
        return crediti;
    }

    public void setCrediti(int crediti) {
        this.crediti = crediti;
    }

    public String getDocente() {
        return docente;
    }

    public void setDocente(String docente) {
        this.docente = docente;
    }

    public String getUtente() {
        return utente.getUtente().getLogin();
    }

    //funzioni supplementari

    @Override
    public String toString() {
        return nome;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Corso other = (Corso) obj;
        if ((this.nome == null) ? (other.nome != null) : !this.nome.equals(other.nome)) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 61 * hash + (this.nome != null ? this.nome.hashCode() : 0);
        return hash;
    }
    
    
}
